import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

public class FileInputStreamDemo {
    public static void main(String[] args) throws Exception {
        //创建一个文件字节输入管道和文件接通
        //InputStream is = new FileInputStream(new File("file-io\\src\\data.txt"));
        //FileInputStream的构造器是可以直接用路径做参数的
        InputStream is = new FileInputStream("file-io\\src\\data.txt");

        //用read方法一个一个字节的读取(返回一个int型的编码),读取之后文件指针会自增,直到读取完成返回-1;
//        System.out.println((char) is.read());
//        System.out.println((char) is.read());
//        System.out.println((char) is.read());
//        System.out.println((char) is.read());
//        System.out.println(is.read());

        //使用循环改进读取
//        int b;
//        while((b = is.read()) != -1){
//            System.out.print((char) b);
//        }

        //read可以指定参数,每次读取一个字节数组
//        byte[] buffer = new byte[3];
//        int len = is.read(buffer);//每次读3个字节,返回读取的长度
//        String s = new String(buffer);
//        System.out.println("len:" + len);
//        System.out.println(s);
//        //read带buffer参数是覆盖写入的,也就是读到最后一组的时候,只会覆盖前几个字节,后面的还保持上一组的数据,这时候直接转成字符串就可能乱码
//        int len2 = is.read(buffer);
//        String s2 = new String(buffer,0,len2);//使用String的这个构造器就可以实现不越界访问
//        System.out.println(s2);

        //再次改进使用循环读取字节流
        byte[] buffer2 = new byte[3];
        int len3 = 0;
        while((len3 = is.read(buffer2))!=-1){
            String s3 = new String(buffer2,0,len3);
            System.out.print(s3);
        }

        //这样仍然无法彻底解决文字的编码被截导致的乱码现象,可以直接一次读完整个文件
        InputStream is2 = new FileInputStream("file-io\\src\\data2.txt");
        byte[] buffer3 = is2.readAllBytes();
        System.out.println(new String(buffer3));
    }
}
